01. 常用基本数据类型

本章概要

  • 学习材料:年金本金、利率、期限、证券代码字符串与现金流金额。
  • 本章任务:在“证券代码处理”和“精确计算”页完成字符串切片、类型转换及 Decimal 金额运算。
  • 完成后你将得到:证券代码前后缀、年金终值和净现金流两位小数表。
  • 自我检查:用等比数列反推终值、核对字符串长度;无法转数值或金额精度不足时先检查原因。
  • 拓展练习:把同一类型选择规则拓展应用到另一笔人民币现金流。

本章导览

Python基本数据类型知识总览 展示本章涵盖的四大数据类型:数值型、字符串型、布尔型与类型转换。 Python 基本数据类型 数据类型 Data Types 数值型 int / float 字符串型 str 布尔型 True / False 类型转换 int() / float() / str()

为什么数据类型很重要?

在金融和商业数据分析中,选择正确的数据类型是构建可靠程序的基础。

  • 股价是浮点数(float):105.50
  • 交易量是整数(int):23000
  • 股票代码是字符串(str):'600000.SH'
  • 是否涨停是布尔值(bool):True

数据类型决定了你可以对数据执行哪些操作

Python的类型系统:动态 + 强类型

特征 含义 举例
动态类型 变量无需声明类型,运行时自动绑定 x = 10 自动识别为int
强类型 不同类型之间不会隐式转换 '10' + 5 会报错
  • 优势:阻止部分不合理的隐式跨类型运算,减少类型混用错误
  • 精度边界:强类型不保证数值精确;0.1 + 0.2 的二进制浮点结果通常是 0.30000000000000004
  • 金融意义:账务金额应按明确舍入规则使用 Decimal 或整数最小货币单位,不能仅依赖 float

数值类型概览:int 与 float

Python中的数值类型主要包括两大类:

类型 说明 示例
int(整型) 任意精度整数,不限大小 100, -5, 0
float(浮点型) IEEE 754 双精度浮点数 3.14, -0.01
# 整型:精度只受内存限制
shares_count = 500         # 股票数量(整型)
print(type(shares_count))  # <class 'int'>

# 浮点型:约15-17位有效数字
stock_price = 105.50       # 股票价格(浮点型)
print(type(stock_price))   # <class 'float'>
<class 'int'>
<class 'float'>

年金终值的计算公式

普通年金(Ordinary Annuity)是金融学中的核心概念,指在每期期末进行等额收付的系列款项。

\[ \large{ FV = A \times \frac{(1+i)^n - 1}{i} } \]

  • \(FV\):年金终值
  • \(A\):每期年金金额
  • \(i\):每期利率
  • \(n\):期数

公式推导:等比数列求和

每期末支付金额A,利率i,期数n,各期终值累加为:

\[ \large{ FV = A(1+i)^{n-1} + A(1+i)^{n-2} + \cdots + A } \]

这是首项为A、公比为\((1+i)\)、项数为n的等比数列,由求和公式得:

\[ \large{ FV = \frac{A[(1+i)^n - 1]}{(1+i) - 1} = A \times \frac{(1+i)^n - 1}{i} } \]

运行前预测|任务一:计算普通年金终值

  • 输入预测:运行前先写出 AinF 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。
  • 结果预测:不展开答案,先预测将得到“普通年金终值是{:.2f}”相关结果;同时写出方向、数量级或表格/图形结构。
  • 完成要求:能独立说明本任务从输入到“任务一:计算普通年金终值”结果的关键步骤,原样录入平台代码并得到可核对的运行结果。

⭐ 任务一:计算普通年金终值

# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
#任务一:完成计算普通年金终值的小程序
#计算普通年金终值
A=10000
i=0.05  # 设置年利率为5%
n=10  # 设置投资期限为10年
F=A*((1+i)**n-1)/i  # 根据普通年金终值公式计算终值F
print("普通年金终值是{:.2f}".format(F))  # 格式化输出普通年金终值(保留两位小数)

任务复盘|任务一:计算普通年金终值

运行后核对:核对 AinF 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。

拓展练习:只改变一个关键输入或业务场景,先预测输出如何变化,再运行验证并解释变化原因。

代码解析:变量赋值与幂运算

刚才的代码用到了几个核心语法:

  • 变量赋值:用 = 将值绑定到变量名
    • A = 10000 → 每期金额一万元
  • 幂运算符** 表示乘方
    • (1+i)**n\((1+0.05)^{10}\)
  • 运算符优先级:括号 > 幂运算 > 乘除 > 加减
  • 格式化输出'{:.2f}'.format(F) 保留两位小数

实际应用场景

年金终值公式在生活中有很多实际应用:

场景 说明
养老金规划 计算每月定投在退休时的总额
教育金储备 计算每月储蓄教育基金的未来价值
企业偿债基金 为偿还到期债务而建立的偿债基金

掌握了年金终值的计算,就掌握了复利的力量!

字符串类型简介

字符串是Python中用于表示文本数据的类型。

  • 引号创建:'hello''沪深300'
  • Python 3 采用 Unicode 编码,支持中英文
  • 字符串是不可变对象:修改操作实际上创建了新字符串

金融应用场景

  • 证券代码:'600000.SH'
  • 公司名称:'中国建设银行'
  • 交易日期:'2025-12-31'

字符串索引与切片

字符串索引与切片 展示字符串 ilovepython 的正向索引与切片操作 字符串索引机制:s = 'ilovepython' i l o v e p y t h o n 012 345 678 910 ↑ 正向索引 -11-10-9 -8-7-6 -5-4-3 -2-1 ↑ 负向索引 切片操作示例: s[0] → 'i' 第一个字符 s[2:5] → 'ove' 索引2到4 s[::-1] → 'nohtypevoli' 反转字符串 s[-1] → 'n' 最后一个字符 s[::2] → 'ioeyhн' 步长为2

运行前预测|任务二:字符串的基本操作

  • 输入预测:运行前先写出 sa 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。
  • 结果预测:不展开答案,先预测将得到a 的结果;同时写出方向、数量级或表格/图形结构。
  • 完成要求:能独立说明本任务从输入到“任务二:字符串的基本操作”结果的关键步骤,原样录入平台代码并得到可核对的运行结果。

⭐ 任务二:字符串的基本操作

# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
#任务二:给定字符串按要求输出
s = 'ilovepython'
a = 'helloworld'  # 定义第二个字符串变量
print(s)  # 输出完整字符串s
print(s[0])  # 输出字符串s的第一个字符(索引为0)
print(s[2:5])  # 输出字符串s的切片(索引2到4)
print(s+a)  # 输出两个字符串拼接后的结果
print(s.upper())  # 输出字符串s转换为大写后的结果

任务复盘|任务二:字符串的基本操作

运行后核对:核对 sa 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。

拓展练习:只改变一个关键输入或业务场景,先预测输出如何变化,再运行验证并解释变化原因。

代码解析:任务二中的核心操作

代码 操作 结果
s[0] 获取第一个字符 'i'
s[2:5] 切片(索引2到4) 'ove'
s + a 字符串拼接 'ilovepythonhelloworld'
s.upper() 转换为大写 'ILOVEPYTHON'

关键点:索引从 0 开始;切片 [start:end] 含首不含尾;+ 对字符串表示拼接、对数字表示加法。

中文字符串处理

Python 3 采用 Unicode 编码,可以无缝处理中文字符:

# 中文字符串示例
chinese = '沪深300指数'

# len()返回字符数(非字节数)
print(len(chinese))    # 输出: 7

# 索引和切片同样适用
print(chinese[0])      # 输出: 沪
print(chinese[:2])     # 输出: 沪深
7
沪
沪深

每个中文字符和英文字符在索引时地位相同,都占一个位置。

金融应用:证券代码处理

# 证券代码标准化:拼接股票代码与交易所标识
stock_code = '000001'
exchange = 'SZ'
full_code = stock_code + '.' + exchange
print(full_code)  # 000001.SZ (平安银行)

# 公司名称格式化:首字母大写
company = 'china construction bank'
print(company.title())  # China Construction Bank

# 从完整代码中提取交易所信息
code_with_exchange = '600000.SH'
market = code_with_exchange.split('.')[1]
print(market)  # SH (上海证券交易所)
000001.SZ
China Construction Bank
SH

类型转换:为什么需要?

不同来源的金融数据,其类型可能不一致:

  • 从Excel读取的价格可能是字符串 '10.55'
  • 计算交易金额需要的是浮点数 10.55
  • 展示结果又需要转回字符串

Python是强类型语言,不同类型之间不能直接运算,必须显式转换

常用类型转换函数

函数 功能 示例 金融应用
int() 转为整型 int('123')123 交易量转换
float() 转为浮点型 float('3.14')3.14 价格转换
str() 转为字符串 str(100)'100' 输出展示
bool() 转为布尔型 bool(1)True 状态判断

类型转换:正确与错误的方式

# 正确:显式转换后再计算
price_str = '10.55'
price_num = float(price_str)  # 字符串 → 浮点数
quantity = 100
amount = price_num * quantity
print(f'交易金额: {amount:.2f}')  # 1055.00

# 错误:不同类型不能直接运算
try:
    result = '10.55' + 100  # 字符串 + 整数 → TypeError!
except TypeError as error_message:
    print(f'错误: {error_message}')
交易金额: 1055.00
错误: can only concatenate str (not "int") to str

强类型的好处:避免因隐式转换导致的金融计算错误!

布尔类型:True 与 False

语法预览:本页开始出现 if/else,只要求读懂输入与输出;独立编写分支放在第 8 章随堂练习,零基础学习者可按课程入口路线先完成第 2、8、9 章。

布尔类型只有两个值,在金融决策中广泛用于条件判断

# 比较运算符 → 返回布尔值
price = 105.5
reference_price = 100.0

is_above_ma = price > reference_price
print(is_above_ma)  # True
True

比较运算符速查

常用比较运算符

运算符 含义 示例
>, < 大于、小于 105 > 100True
>=, <= 大于等于、小于等于 100 >= 100True
== 等于 10 == 10True
!= 不等于 10 != 5True

逻辑运算符:组合多个条件

运算符 含义 规则
and 两个都为True才为True
or 任一为True就为True
not 取反
# 中性条件组合示例
price_above_ma = True     # 价格高于均线
volume_above_avg = True   # 成交量放大

# 规则A:两个布尔条件同时成立
rule_a = price_above_ma and volume_above_avg
print(f'RULE_A: {rule_a}')  # True
RULE_A: True

实战:上下界提醒判断

# 上下界提醒判断
current_price = 102.5   # 当前价格
stop_loss = 98.0         # 止损价
take_profit = 108.0      # 止盈价

# 触及任一课堂边界则进入核对
needs_review = (current_price <= stop_loss) or (current_price >= take_profit)
print(f'是否进入REVIEW: {needs_review}')  # False(未触及)
是否进入REVIEW: False

当前示例中的数值 102.5 位于两个假设边界之间,因此程序显示 REVIEW。这只是课堂判断结果,不是交易指令。

真值测试:哪些值被视为 False?

Python中所有对象都可以进行布尔值测试:

被视为 False (Falsy) 被视为 True (Truthy)
None 非None的任何对象
0, 0.0 非零数值
'' (空字符串) 非空字符串
[], (), {} (空容器) 非空容器
False True

真值测试:先判断数据是否为空

# 检查数据是否为空
trading_data = []  # 空列表
if trading_data:
    print('数据存在,开始分析')
else:
    print('数据为空,跳过分析')  # ← 执行这行
数据为空,跳过分析

浮点数精度:金融计算的陷阱

# 一个看似简单的加法...
result = 0.1 + 0.2
print(result)               # 0.30000000000000004 (不是0.3!)
print(0.1 + 0.2 == 0.3)    # False!
0.30000000000000004
False

原因:0.1 和 0.2 在二进制中无法精确表示(类似于 \(1/3\) 在十进制中无法精确表示)。

在金融计算中,这种微小误差可能累积失控

解决方案:精确计算方法

import math
from decimal import Decimal, getcontext

# 方法1:近似比较 (math.isclose)
print(math.isclose(0.1 + 0.2, 0.3))  # True

# 方法2:Decimal模块 (精确十进制运算)
getcontext().prec = 6  # 设置6位有效数字
price1 = Decimal('0.1')  # 注意:参数必须是字符串
price2 = Decimal('0.2')
result = price1 + price2
print(result)                       # 0.3 (精确!)
print(result == Decimal('0.3'))     # True
True
0.3
True

精确计算:选择工具的规则

金融计算最佳实践

  • 货币计算:使用 Decimal 模块
  • 比较运算:使用 math.isclose() 而非 ==

本章总结

数据类型 关键字 金融应用
int 整型 交易量、期数
float 浮点型 股价、利率
str 字符串 证券代码、公司名称
bool 布尔型 条件判断、交易信号

核心要点

  • Python是强类型语言,类型转换必须显式进行
  • 金融计算要注意浮点精度问题,推荐使用 Decimal
  • 掌握字符串操作是数据清洗的基础

随堂练习

  • 问题 1|需要准备哪些数据?:年金本金、利率、期限、证券代码字符串与现金流金额。
  • 问题 2|需要完成哪些操作?:在“证券代码处理”和“精确计算”页完成字符串切片、类型转换及 Decimal 金额运算。
  • 问题 3|应得到哪些结果?:证券代码前后缀、年金终值和净现金流两位小数表。
  • 问题 4|怎样确认结果可靠?:用等比数列反推终值、核对字符串长度;无法转数值或金额精度不足时先检查原因。
  • 问题 5|换一个情境,怎样继续应用?:把同一类型选择规则拓展应用到另一笔人民币现金流。
  • 作答提示:请依次写清所用数据、分析过程、所得结果、核对方法和拓展思考。课程所需数据见前言中的下载入口;教学平台固定题按页面说明完成。

教师参考解答|答案与说明 1

  • 所用数据与字段:教学最小输入(非案例依据):证券代码 str、交易所 str、金额与费率 Decimal
  • 解答示例|证券代码处理与精确计算(平台保护块之外):

教师参考解答|代码 1

展开代码(代码区可独立滚动)
from decimal import Decimal, localcontext  # 使用局部十进制上下文隔离前序单元的精度状态
raw_security_code='600519'  # 保留证券代码的字符语义
exchange_code='SH'  # 指定交易所后缀
standard_security_code=f'{raw_security_code.zfill(6)}.{exchange_code}'  # 生成标准证券代码
with localcontext() as money_context:  # 为金额乘法建立不受全章共享状态影响的局部环境
    money_context.prec=28  # 设置足够精度以容纳大额本金和费率乘积
    cash_amount=Decimal('100000.00')  # 以字符串构造精确金额
    fee_rate=Decimal('0.0003')  # 以字符串构造精确费率
    net_cash=cash_amount*(Decimal('1')-fee_rate)  # 计算扣费后金额
    rounded_net_cash=net_cash.quantize(Decimal('0.01'))  # 按结算口径保留到分
assert standard_security_code=='600519.SH'  # 另行核对代码格式
assert rounded_net_cash==Decimal('99970.00')  # 用期望金额检查核对局部精度与舍入口径
print(standard_security_code,rounded_net_cash)  # 输出代码与金额

教师参考解答|答案与说明 2

  • 解释答案:证券代码虽由数字字符组成,却不承担算术含义,使用 str 才能保留前导零和市场后缀;金额用二进制 float 可能出现显示误差,结算口径宜用 Decimal。边界是高性能统计估计仍常用 float,但须在结算层统一舍入。
  • 拓展应用答案:将输入替换为长三角上市公司代码与已批准费率;预期代码格式不变、净额随费率单调下降;用格式检查和手算 100000×(1−0.0003) 双重验证。
  • 参考结果600519.SH 99970.00,并通过格式检查
  • 边界 / 局限:最小输入只验证类型选择,不构成上市公司实证
  • 常见错误:证券代码转整数;用 Decimal(0.1);把 5% 写成 5